<?php

	/** Serveur Balloon AJAX.
	 * Cette classe implemente un serveur pret a recevoir et executer des requetes
	 * @author Sebastian Mosser
	 * @date 2006
	 * @version 1.0
 	 */
	
class Bajax {

	/** Lance le serveur !
	 */
	public static function run() {
		
		$debug = PropRetriever::getProp($_GET,"DEBUG");
		
		if ($debug == "true") 
			$request = PropRetriever::getProp($_GET,"request");
		else
			$request = PropRetriever::getProp($_POST,"request");
			
		$request = stripslashes(urldecode($request));
		$request = iconv("ISO-8859-1","UTF-8",$request);
		header('Content-Type: text/html; charset=UTF-8');
		echo self::handle($request);
  }

	/** Permet le traitement d'une requete BalloonXML.
	 * @param $request une chaine de caracteres au format BalloonXML
	 */
	private static function handle($request) {
		$request    = simplexml_load_string($request);

		$className  = ((string) $request->className);
		$methodName = ((string) $request->methodName);

		$parameters = array();
		foreach ($request->params->param as $p)
			$parameters[] = ((string) $p);
		$answer     = self::invoke($className,$methodName,$parameters);
		
		if (is_array($answer))
			return self::displayArray($answer);
			
		return $answer;
	}

	/** Transforme un tableau PHP en code HTML.
	 * Utile pour afficher des informations sous forme brute pour du debug.
	 * @param $a le tableau a afficher
	 */
  private static function displayArray($a) {
      $title = "<h3> Array2Html Answer Translation </h3>";
      
      $tmp = print_r($a,True);
   		$tmp = str_replace(" ","&nbsp;",$tmp);
   		
   		return $title.nl2br($tmp);
  
  }

	/** Effectue une invocation introspective.
	 * @param $className le nom de la classe a invoquer
	 * @param $methodName le nom de la methode statique a invoquer 
	 * @param $parameters un tableau de parametres a passer a la methode.
	 */
	private static function invoke($className, $methodName, $parameters) {
		try {
			// On récupère la méthode statique exposée par introspection
			$method = new ReflectionMethod($className,"bajax_".$methodName);
			// On l'invoque (static ==> NULL) : 
			$ans = $method->invoke(NULL,$parameters);
			return $ans;
		}
		catch(Exception $e) {
		  $ans = "<p> <center> <span class=\"error\">";
		  $ans .= " Une erreur est survenue sur le serveur lors du ";
		  $ans .= "traitement de la demande </span></center></p><br/>";
		  $ans .= nl2br($e->__toString());
		  return $ans;
		}
		
	}

	/** Securisation d'une invocation distante.
	 * Cette fonction permet d'effectuer une verification d'\ref AccessControlList.
	 * @param $aclArray un tableau contenant les groupes autorises.
	 */
	public static function secureInvoke($aclArray) {
		$acl = new AccessControlList();
		foreach($aclArray as $k => $v)
			$acl->setGranted($v);
		return $acl->isExposable(Login::getGroups());
	}

}


?>